package com.kim.store.contorller;

import com.kim.store.contorller.ex.*;
import com.kim.store.entity.User;
import com.kim.store.service.ex.*;
import com.kim.store.util.JsonResult;
import org.apache.tomcat.util.http.fileupload.impl.FileUploadIOException;
import org.springframework.web.bind.annotation.ExceptionHandler;

import javax.servlet.http.HttpSession;

/**
 * 控制层类的基类
 * 功能：异常捕获处理
 */
public class BaseController {
    //表示操作成功的状态码
     public static final int OK = 200;

     //请求处理方法，这个方法的返回值就是需要传递给前端的数据
     //自动将异常对象传递给此方法的参数列表上
     /*当前项目中产生了异常会被统一的拦截的到此方法，这个方法此时充当的是请求处理方法，方法的
       返回值直接给到前端 */
     @ExceptionHandler({ServiceException.class, FileUploadException.class}) //用于同一处理抛出的异常
     public JsonResult<Void> handleException(Throwable e){
         JsonResult<Void> result = new JsonResult<>();
         if(e instanceof UsernameDuplicatedException){
             result.setState(4000);
             result.setMessage("用户名被占用");
         }else if(e instanceof UsernameNotFoundException){
             result.setState(4001);
             result.setMessage("用户数据不存在异常");
         }
         else if(e instanceof PasswordNotMatchException){
             result.setState(4002);
             result.setMessage("用户名的密码错误异常");
         }else if(e instanceof  AddressCountLimitException){
             result.setState(4003);
             result.setMessage("用户收货地址超出上限异常");
         }else if(e instanceof  AccessDeniedException){
             result.setState(4004);
             result.setMessage("收货地址数据非法访问异常");
         }else if(e instanceof  AddressNotFoundException){
             result.setState(4005);
             result.setMessage("用户的收货地址不存在异常");
         }
         else if(e instanceof  ProductNotFoundException){
             result.setState(4006);
             result.setMessage("商品数据未找到异常");
         }else if(e instanceof CartNotFoundException){
             result.setState(4007);
             result.setMessage("购物车数据不存在异常");
         }
         else if(e instanceof InsertException){
             result.setState(5000);
             result.setMessage("注册时产生未知异常");
         }else if(e instanceof UpdateException){
             result.setState(5001);
             result.setMessage("更新数据时产生未知异常");
         }else if(e instanceof DeleteException){
             result.setState(5002);
             result.setMessage("删除数据时产生未知异常");
         }else if(e instanceof FileEmptyException){
             result.setState(6000);
             result.setMessage("上传文件为空");
         }else if(e instanceof FileSizeException){
             result.setState(6001);
             result.setMessage("上传文件大小异常");
         }else if(e instanceof FileTypeException){
             result.setState(6002);
             result.setMessage("上传文件类型异常");
         }else if(e instanceof FileStateException){
             result.setState(6003);
             result.setMessage("上传文件状态异常");
         }else if(e instanceof FileUploadIOException){
             result.setState(6004);
             result.setMessage("上传文件读写异常");
         }
         return result;
    }

    /**
     * session对象主要存在服务器端,可以用于保存服务器的临时数据的对象,所保存的数据可以在整个
     *         项目中都可以通过访问来获取,把session的数据看作一个共享的数据.
     *         首次登录的时候所获取的用户的数据,转移到session对象即可.
     *         session.getAttribute("key")可以将获取session中的数据这种行为封装,封装在
     *         BaseController类中.
     *         (1)封装session对象中数据的获取(封装到父类中),数据的设置(当用户登录成功后进行数据设置,
     *           设置到全局的session对象)
     *         (2)在父类中封装两个数据:获取uid和获取username对应的两个方法.用户头像暂时不考虑,将来封装
     *            到cookie中来使用
     */

    /**
     * 获取session对象中的uid
     * @param session session对象
     * @return 当前登录用户的uid的值
     */
    protected final Integer getUidFromSession(HttpSession session){
        /**
         * session和cookie的区别
         *   session.getAttribute() 的返回值 是Object
         *   cookie 的返回值是 String
         */
       return Integer.valueOf(session.getAttribute("uid").toString());
    }

    /**
     * 获取当前登录用户的username
     * @param session session对象
     * @return 当前登录用户的用户名
     *
     * HttpSession的实现类中重写了父类中的toString()，
     */
    protected final String getUsernameFromSession(HttpSession session){
        return session.getAttribute("username").toString();
    }


}
